/**
 * created by 文阿花, 2021/4/23
 * Copyright (c) 2021, 416143467@qq.com All Rights Reserved.
 * #                   *********                            #
 * #                  ************                          #
 * #                  *************                         #
 * #                 **  ***********                        #
 * #                ***  ****** *****                       #
 * #                *** *******   ****                      #
 * #               ***  ********** ****                     #
 * #              ****  *********** ****                    #
 * #            *****   ***********  *****                  #
 * #           ******   *** ********   *****                #
 * #           *****   ***   ********   ******              #
 * #          ******   ***  ***********   ******            #
 * #         ******   **** **************  ******           #
 * #        *******  ********************* *******          #
 * #        *******  ******************************         #
 * #       *******  ****** ***************** *******        #
 * #       *******  ****** ****** *********   ******        #
 * #       *******    **  ******   ******     ******        #
 * #       *******        ******    *****     *****         #
 * #        ******        *****     *****     ****          #
 * #         *****        ****      *****     ***           #
 * #          *****       ***        ***      *             #
 * #            **       ****        ****                   #
 */
package com.light.mytext.mycustomview.list

import android.content.Context
import android.util.AttributeSet
import android.util.Log
import android.view.View
import android.view.animation.Animation
import android.view.animation.ScaleAnimation
import androidx.recyclerview.widget.ItemTouchHelper
import androidx.recyclerview.widget.RecyclerView
import com.light.mytext.R

/**
 * 描 述：绑定动画
 * 作 者：文阿花  2021-04-23 16:58
 * 修改描述：
 * 修 改 人：
 * 修改版本：
 */
internal class DragRecycleView : RecyclerView {
    //是否允许拖动
    var dragEnable = true

    //是否显示动画
    var showDragAnimation = true

    //事件监听
    var mItemTouchStatus: ItemTouchStatues? = null

    //记录move位置
    var oldPosition=0
    var toPosition=0


    constructor(context: Context) : super(context) {
        init(context, null)
    }

    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {
        init(context, attrs)
    }

    fun init(context: Context?, attrs: AttributeSet?) {
        if (attrs != null) {//xml方式调用
            var ta = context!!.obtainStyledAttributes(attrs, R.styleable.DragRecyclerView)
            dragEnable = ta.getBoolean(R.styleable.DragRecyclerView_drag_enable, true)
            showDragAnimation = ta.getBoolean(R.styleable.DragRecyclerView_show_decoration, true)
        } else {
            dragEnable = true
            showDragAnimation = true
        }
        mDragItemTouchHelper.attachToRecyclerView(this)
    }

    //设置是否允许拖动
    @JvmName("setDragEnable1")
    fun setDragEnable(b: Boolean) {
        dragEnable = b
    }

    //设置是否显示动画
    @JvmName("setShowDragAnimation1")
    fun setShowDragAnimation(b: Boolean) {
        showDragAnimation = b
    }

    //动画
    private var startAnimation: ScaleAnimation? = ScaleAnimation(
        1.0f,
        1.1f,
        1.0f,
        1.1f,
        Animation.RELATIVE_TO_SELF,
        0.5f,
        Animation.RELATIVE_TO_SELF,
        0.5f
    )
    private var endAnimation: ScaleAnimation? = ScaleAnimation(
        1.1f,
        1.0f,
        1.1f,
        1.0f,
        Animation.RELATIVE_TO_SELF,
        0.5f,
        Animation.RELATIVE_TO_SELF,
        0.5f
    )

    fun startAnimation(v: View) {
        v.animation = startAnimation
        startAnimation!!.fillAfter = true
        startAnimation!!.duration = 200
        startAnimation!!.start()
    }

    fun endAnimation(v: View) {
        v.animation = endAnimation
        endAnimation!!.fillAfter = true
        endAnimation!!.duration = 200
        endAnimation!!.start()
    }


    fun bindEvent(onItemTouchEvent: HoldTouchHelper.OnItemTouchEvent?): DragRecycleView? {
        HoldTouchHelper.bind(this, onItemTouchEvent)
        return this
    }


   var mDragItemTouchHelper =ItemTouchHelper(object : ItemTouchHelper.Callback() {

       /**
        * 在此方法里面我们需要构建两个flag，一个是dragFlags，表示拖动效果支持的方向，
        * 另一个是swipeFlags，表示侧滑效果支持的方向。在我们的Demo中，拖动执行上下两个方向，
        * 侧滑执行左右两个方向，这些操作我们都可以在此方法里面定义。
        */
       override fun getMovementFlags(recyclerView: RecyclerView, viewHolder: ViewHolder): Int {
           //上下滑动
           val dragFlags = ItemTouchHelper.UP or ItemTouchHelper.DOWN
           //向左滑动
           val swipeFlags = ItemTouchHelper.LEFT or ItemTouchHelper.RIGHT
           return makeMovementFlags(dragFlags, 0)
//           return makeMovementFlags(dragFlags, swipeFlags)
       }

       /**
        * 当拖动效果已经产生了，会回调此方法。在此方法里面，我们通常会更新数据源，
        * 比如说，一个ItemView从0拖到了1位置，那么对应的数据源也需要更改位置。
        */
       override fun onMove(
           recyclerView: RecyclerView,
           viewHolder: ViewHolder,
           target: ViewHolder
       ): Boolean {

           oldPosition=viewHolder.adapterPosition
           toPosition=target.adapterPosition
//           mItemTouchStatus!!.onItemMove(viewHolder.adapterPosition, target.adapterPosition)
//           Log.i("DragRecycleView==",mItemTouchStatus!!.onItemMove(viewHolder.adapterPosition, target.adapterPosition).toString())
           return  mItemTouchStatus!!.onItemMove(viewHolder.adapterPosition, target.adapterPosition)
//           return  mItemTouchStatus!!.onItemMove(viewHolder.adapterPosition, target.adapterPosition)
       }

       /**
        * 当侧滑效果以上产生了，会回调此方法。在此方法里面，我们也会更新数据源。
        * 与onMove方法不同到的是，我们在这个方法里面从数据源里面移除相应的数据，
        * 然后调用notifyXXX方法就行了。
        */
       override fun onSwiped(viewHolder: ViewHolder, direction: Int) {
       }

       override fun onSelectedChanged(viewHolder: ViewHolder?, actionState: Int) {
           /**
            * actionState:
            * 1.ACTION_STATE_IDLE表示没有任何手势，此时selected对应的应当是null；
            * 2. ACTION_STATE_SWIPE表示当前ItemView处于侧滑状态；
            * 3. ACTION_STATE_DRAG表示当前ItemView处于拖动状态。
            */
           if (showDragAnimation && actionState == ItemTouchHelper.ACTION_STATE_DRAG) {
               startAnimation(viewHolder!!.itemView)
           }
           super.onSelectedChanged(viewHolder, actionState)
       }

       override fun clearView(recyclerView: RecyclerView, viewHolder: ViewHolder) {
           super.clearView(recyclerView, viewHolder)
           if (showDragAnimation) {
               //操作结束后会走这个方法
               removeView(viewHolder.itemView)

           }
       }

   })

    fun setDragAdapter(dragBaseAdapter: ItemTouchStatues?): DragRecycleView? {
        if (dragBaseAdapter is Adapter<*>) {
            this.mItemTouchStatus = dragBaseAdapter
            mDragItemTouchHelper.attachToRecyclerView(this)
            super.setAdapter(mItemTouchStatus as Adapter<*>?)
        } else {
            throw IllegalArgumentException()
        }
        return this
    }
}